package pl.edu.agh.mobsys.activities;

import org.jivesoftware.smack.Roster;

import pl.edu.agh.mobsys.R;
import pl.edu.agh.mobsys.data.Contact;
import pl.edu.agh.mobsys.data.ContactFactory;
import pl.edu.agh.mobsys.data.PersonalContact;
import pl.edu.agh.mobsys.data.SmoaContact;
import pl.edu.agh.mobsys.data.validation.Validator;
import pl.edu.agh.mobsys.utils.Constants;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;

/**
 * Widok z edycją danych kontaktu - osobowy i smoa na jednym widoku, wybór
 * zależy od checkboxu.
 * 
 * @see {@link Roster} Lista kontaktów powinna być przechowywana w strukturze
 *      Roster protokołu XMPP - ponieważ jest ona przechowywana na serwerze
 *      możliwe jest uzyskanie tej samej listy kontaków na różnych klientach.
 *      Ponadto możliwe jest wykreywanie obecności itp.
 * */
public class ContactEdit extends Activity {

	private EditText alias, id1, id2, resource1, resource2;

	private TextView textView1, textView2;

	private CheckBox checkBox;

	private String contactAlias = null;

	private SharedPreferences prefs;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.contact_edit);

		// wszystkie pola formularza
		alias = (EditText) findViewById(R.id.con_alias);
		id1 = (EditText) findViewById(R.id.con_id1);
		id2 = (EditText) findViewById(R.id.con_id2);
		resource1 = (EditText) findViewById(R.id.con_resource_1);
		resource2 = (EditText) findViewById(R.id.con_resource_2);
		checkBox = (CheckBox) findViewById(R.id.checkbox_smoa);
		textView1 = (TextView) findViewById(R.id.con_textview_id1);
		textView2 = (TextView) findViewById(R.id.con_textview_id2);

		// edycja lub tworzenie nowego kontaktu
		final String mode = getIntent().getAction();

		prefs = getSharedPreferences(Constants.SHARED_PREFS_KEY_CONTACTS,
				Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

		Button save = (Button) findViewById(R.id.save);
		// edycja kontaktu
		if (Constants.CONTACT_EDIT.equals(mode)) {
			contactAlias = (String) getIntent().getSerializableExtra(
					Constants.ACTIVATED_CONTACT);
			Contact c = ContactFactory.buildContact(contactAlias, prefs
					.getString(contactAlias, "???"));
			alias.setText(c.getAlias());

			// w zależności od typu kontaktu ustawiany jest różny początkowy
			// widok
			if (c instanceof SmoaContact) {
				// kontakt SMOA
				SmoaContact s = (SmoaContact) c;
				id1.setText(s.getJobReceiverXmppName());
				id2.setText(s.getNotifierXmppName());
				resource1.setText(s.getJobReceiverResource());
				resource2.setText(s.getNotifierResource());
				smoaView();
			} else if (c instanceof PersonalContact) {
				// kontakt osobowy
				PersonalContact p = (PersonalContact) c;
				id1.setText(p.getXmppName());
				resource1.setText(p.getResource());
				personalView();
			}

			save.setText(getResources().getString(R.string.con_edit_save));
		} else { // nowy kontakt
			alias.setText("");
			id1.setText("");

			// domyślnie osobowy
			personalView();
			save.setText(getResources().getString(R.string.con_edit_add));
		}

		// checkbox warunkuje typ kontaktu a zatem kształt interfejsu
		checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			public void onCheckedChanged(CompoundButton buttonView,
					boolean isChecked) {
				if (isChecked)
					smoaView(); // jeśli zaznaoczny to SMOA
				else
					personalView(); // jeśli odznaczony to osobowy
			}
		});

		// guzik powrótu do listy kontaktów bez zapisu
		((Button) findViewById(R.id.abort))
				.setOnClickListener(new OnClickListener() {
					public void onClick(View v) {
						startActivity(new Intent(Constants.CONTACTS_LIST));
					}
				});

		// guzik zapisu
		((Button) findViewById(R.id.save))
				.setOnClickListener(new OnClickListener() {
					public void onClick(View v) {

						// walidacja
						final String warn = validate();
						if (warn != null) {
							runOnUiThread(new Runnable() {
								public void run() {
									// wypisanie ostrzeżenia w razie problemów
									Toast.makeText(getApplicationContext(),
											warn, Toast.LENGTH_SHORT).show();
								}
							});
							return;
						}

						// tworzenie kontaktu o danych wziętych z aktualnych pól
						// formularza
						Contact c;
						if (checkBox.isChecked()) {
							c = new SmoaContact(id2.getText().toString(), id1
									.getText().toString(), resource2.getText()
									.toString(), resource1.getText().toString());
						} else {
							c = new PersonalContact(id1.getText().toString(),
									resource1.getText().toString());
						}

						// usunięcie z preferencji starego kontaktu i dodanie
						// nowego
						prefs.edit().remove(contactAlias).putString(
								alias.getText().toString(),
								ContactFactory.encodeContact(c)).commit();

						startActivity(new Intent(Constants.CONTACTS_LIST));
					}

					// walidacja z podświetlaniem pól gdzie wykryto błędy w
					// danych wejściowych
					private String validate() {

						for (EditText et : new EditText[] { id1, id2, alias }) {
							et.setBackgroundColor(Color.WHITE);
						}

						// walidacja pierwszego identyfikatora - zawsze
						String warning = Validator.validateXmppId(id1.getText()
								.toString());
						if (warning != null) {
							id1.setBackgroundColor(Color.RED);
							return warning;
						}

						// walidacja drugiego - tylko kiedy jest aktywny
						if (checkBox.isChecked()) {
							warning = Validator.validateXmppId(id2.getText()
									.toString());
							if (warning != null) {
								id2.setBackgroundColor(Color.RED);
								return warning;
							}
						}

						// walidacja aliasu - zawsze
						final String a = alias.getText().toString();
						if (a == null || "".equals(a)) {
							alias.setBackgroundColor(Color.RED);
							return "Fill in required fields.";
						}

						// walidacja na unikatowość aliasu
						if (Constants.CONTACT_EDIT.equals(mode)
								&& !contactAlias.equals(a)) {
							// jeśli zmiana nie dotyczny aliasu to nie ma
							// potrzeby
							// sprawdzać unikatowości
							if (prefs.contains(a)) {
								alias.setBackgroundColor(Color.RED);
								return "Alias \"" + a + "\" already in use.";
							}
						}

						return null;
					}
				});
	}

	/**
	 * Ustawienie widoku smoa - widoczne więcej pól, inne etykiety.
	 * */
	private void smoaView() {
		id2.setVisibility(View.VISIBLE);
		textView1.setText(getResources().getString(
				R.string.con_edit_smoa_job_receiver));
		textView2.setVisibility(View.VISIBLE);
		textView2.setText(getResources().getString(
				R.string.con_edit_smoa_notifier));
		resource2.setVisibility(View.VISIBLE);
		checkBox.setChecked(true);
	}

	/**
	 * Ustawienie widoku osobowego (nie smoa) - widoczne mnie pól, inne
	 * etykiety.
	 * */
	private void personalView() {
		textView1.setText(getResources().getString(R.string.con_edit_id));
		id2.setVisibility(View.GONE);
		textView2.setVisibility(View.GONE);
		resource2.setVisibility(View.GONE);
		checkBox.setChecked(false);
	}
}